package com.efeichong.dynamic;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;


/**
 * @author lxk
 * @date 2022/8/28
 * @description 动态数据源注解@DS拦截器注入
 */
@Slf4j
public class DynamicDataSourceContextHolder {


    /*
     * 当使用ThreadLocal维护变量时，ThreadLocal为每个使用该变量的线程提供独立的变量副本，
     * 所以每一个线程都可以独立地改变自己的副本，而不会影响其它线程所对应的副本。
     */
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

    /*
     * 管理所有的数据源id;
     * 主要是为了判断数据源是否存在;
     */
    public static List<String> dataSourceIds = new ArrayList<String>();

    /**
     * 设置数据源
     *
     * @param dataSourceType
     */
    public static void push(String dataSourceType) {
        log.info("切换至{}数据源", dataSourceType);
        contextHolder.set(dataSourceType);
    }

    /**
     * 获取数据源
     *
     * @return
     */
    public static String get() {
        return contextHolder.get();
    }

    /**
     * 第一个为默认数据源
     *
     * @return
     */
    public static String getDefault() {
        return dataSourceIds.get(0);
    }

    /**
     * 清除数据源
     */
    public static void clear() {
        contextHolder.remove();
    }

    public static void addId(String name) {
        dataSourceIds.add(name);
    }

    /**
     * 判断指定DataSource当前是否存在
     *
     * @param dataSourceId
     * @return
     */
    public static boolean contains(String dataSourceId) {
        return dataSourceIds.contains(dataSourceId);
    }
}